#!/usr/bin/env python
# -*-coding:utf-8 -*-
import operator
from functools import reduce

"""
map
1. map将传入的函数依次作用到序列的每个元素，并把结果作为新的Iterator返回
2. map()作为高阶函数，事实上它把运算规则抽象了

reduce
1. reduce把一个函数作用在一个序列[x1, x2, x3, ...]上，这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

"""

# 1. map对可迭代对象中的每个元素进行相同的操作
li = [2, 3, 4]


def fn(x):
    return x + 1


res = map(fn, li)
print(list(res))


# 1.1 map 列表中字符串元素首字母转大写
def normalize(name):
    return name.capitalize()


L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)

# 2. reduce 从左到右对一个序列的项累计地应用有两个参数的函数，以此合并序列到一个单一值。（例如累加或累乘列表元素等等）
nums = [1, 2, 3, 4]


def fn(x, y):
    return x * y


resp = reduce(fn, nums)
print(resp)


# 2.1  实现和上面相同的功能
def prod(numbers):
    # 这里使用了operator.mul作为reduce的函数参数，它表示两个元素相乘的操作
    # reduce函数的第三个参数1是初始值，表示乘积的起始值,可以任意调整，如果是相加操作就需要移除掉初始值了或者置为0
    return reduce(operator.mul, numbers, 1)


v1 = prod(nums)
print(v1)


# 2.2 reduce  把字符串'123.456'转换成浮点数123.456
def str2float(s):
    # 分割整数部分和小数部分
    parts = s.split('.')

    # 将整数部分转换为浮点数,三元操作符
    integer_part = float(parts[0]) if len(parts) > 0 else 0.0

    # 将小数部分转换为浮点数并除以10的相应次方
    decimal_part = 0.0
    if len(parts) > 1:
        decimal_str = parts[1]
        for i, digit in enumerate(decimal_str, start=1):
            decimal_part += float(digit) / (10 ** i)

    # 使用reduce函数将整数部分和小数部分相加
    return reduce(lambda x, y: x + y, [integer_part, decimal_part])


# 测试函数
s = '123.456'
result = str2float(s)
print(result)  # 应该输出123.456
